﻿using System;
using System.Web.Mvc;
using PagedList;
using SiteCredivale.ViewModels;
using App.Interface;
using AutoMapper;
using Domain.Entidades;

namespace SiteCredivale.Areas.Intranet.Controllers
{
    public class SolicitacaoController : Controller
    {
        //
        // GET: /Intranet/Aviso/

        private readonly IUsuarioAppService _usuarioapp;
        private readonly ISolicitacaoAppService _solicitacaoapp;

        public SolicitacaoController()
        {

        }

        public SolicitacaoController(IUsuarioAppService usuarioapp, ISolicitacaoAppService solicitacaoapp)
        {
            _usuarioapp = usuarioapp;
            _solicitacaoapp = solicitacaoapp;
        }

        [HttpGet]
        public ActionResult GetSetor()
        {


            try
            {
              
             
                return Json(_usuarioapp.busca_setor_unidade("set",int.Parse(Request.QueryString.Get("unidade"))), JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                ViewBag.err = "Erro ao buscar setor: " + ex.Message + ", contate o administrador";
                throw ex;
            }
          
        }


        [HttpGet]
        public ActionResult GetImpressora()
        {


            try
            {

             
                return Json(_solicitacaoapp.carrega_impressora(int.Parse(Request.QueryString.Get("unidade")), int.Parse(Request.QueryString.Get("setor"))), JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                ViewBag.err = "Erro ao buscar impressora: " + ex.Message + ", contate o administrador";
                throw ex;
            }

        }

        [HttpGet]
        public ActionResult GetNS()
        {


            try
            {
                return Json(_solicitacaoapp.carrega_nserie(int.Parse(Request.QueryString.Get("impressora"))), JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                ViewBag.err = "Erro ao buscar Nº série: " + ex.Message + ", contate o administrador";
                throw ex;
            }

        }


        public ActionResult Manutencao(int? page, string dt1, string dt2)
        {

            try
            {


                if (_usuarioapp.verifica_permissao(5352) == false)
                {
                    TempData["msg_retorno"] = "Esta opção não esta habilitado para o seu usuário, por favor contate o suporte !";
                    return RedirectToAction("Home", "Inicio");
                }

                DateTime data2;
                DateTime data1;

                if (DateTime.TryParse(dt1, out data1) == false)
                {
                    data1 = DateTime.Now.AddMonths(-1);
                }

                if (DateTime.TryParse(dt2, out data2) == false)
                {
                    data2 = DateTime.Now;
                }

                if (data2 < data1)
                {
                    ModelState.AddModelError("", "A data inicial não pode ser maior que a final");
                    data1 = DateTime.Now.AddMonths(-1);
                    data2 = DateTime.Now;
                }

                ViewBag.dt1 = data1.ToString();
                ViewBag.dt2 = data2.ToString();



                const int pageSize = 10;
                var pagesol= _solicitacaoapp.Listar(data1, data2).ToPagedList(page ?? 1, pageSize);
                return View("Manutencao", pagesol);


            }
            catch (Exception ex)
            {
                throw ex;
            }


        }

        [HttpPost, Authorize]
        public ActionResult Manutencao(FormCollection form)
        {

            try
            {

                DateTime data2;
                DateTime data1;

                if (DateTime.TryParse(form["calendario1"], out data1) == false)
                {
                    data1 = DateTime.Now.AddMonths(-1);
                }

                if (DateTime.TryParse(form["calendario2"], out data2) == false)
                {
                    data2 = DateTime.Now;
                }

                if (data2 < data1)
                {
                    ModelState.AddModelError("", "A data inicial não pode ser maior que a final");
                    data1 = DateTime.Now.AddMonths(-1);
                    data2 = DateTime.Now;
                }

                ViewBag.dt1 = data1.ToString();
                ViewBag.dt2 = data2.ToString();



                const int pageSize = 10;
                var pagesol = _solicitacaoapp.Listar(data1, data2).ToPagedList(1, pageSize);
                return View(pagesol);
            }
            catch (Exception ex)
            {

                throw ex;
            }

        }

        [HttpPost, Authorize]
        public ActionResult Cancelar(string codigo, string dt1, string dt2, string pagina)
        {
            try
            {

                if (_usuarioapp.verifica_permissao(5354) == false)
                {
                    TempData["msg_retorno"] = "Esta opção não esta habilitado para o seu usuário,por favor contate o suporte !";
                    return RedirectToAction("Manutencao", "Solicitacao");
                }



                _solicitacaoapp.deletar(_solicitacaoapp.GetId(int.Parse(codigo)));
                return RedirectToAction("Manutencao", "Solicitacao", new { page = int.Parse(pagina), dt1 = dt1, dt2 = dt2, });

            }
            catch (Exception ex)
            {
                if (ex.Message.Substring(0, 5) != "email")
                {
                    TempData["msg_err"] = "Erro ao cancelar solicitação: " + ex.Message + ", contate o administrador";

                }

                    return RedirectToAction("Manutencao", "Solicitacao", new { page = int.Parse(pagina), dt1 = dt1, dt2 = dt2, });
            }




        }

        [Authorize]
        public ActionResult Inserir()
        {

            try
            {

                if (_usuarioapp.verifica_permissao(5353))
                {
                    solicitacaoViewModel sol = new solicitacaoViewModel();
                    sol.data_horario = DateTime.Now.ToShortDateString();
                    ViewBag.unidade = new SelectList(_usuarioapp.busca_unidades(0), "uni_codigo", "uni_descricao", _usuarioapp.GetUsuarioLogado(0).uni_codigo);
                    ViewBag.sol_tipo = new SelectList(_solicitacaoapp.carrega_tipo_solicitacoes(), "tip_codigo", "tip_descricao");
                    if (_usuarioapp.verifica_permissao(5355))
                    {
                       
                        ViewBag.flag_todos = 1;
                    }
                    else {

                        ViewBag.flag_todos = 0;
                    }

                  
                  


                    return View(sol);
                }
                else
                {

                    TempData["msg_retorno"] = "Esta opção não esta habilitado para o seu usuário, por favor contate o suporte !";
                    return RedirectToAction("Home", "Inicio");
                }

            }
            catch (Exception ex)
            {

                throw ex;
            }
            
        }

        [HttpPost, Authorize]
        public ActionResult Inserir(solicitacaoViewModel solicitacao)
        {


            try
            {
                if (string.IsNullOrEmpty(solicitacao.sol_descricao))
                {
                    ModelState.AddModelError("solicitacao_descricao", "*Campo obrigatório.");
                }
                else
                {
                    if (solicitacao.sol_tipo == 1 && solicitacao.sol_descricao=="0")
                    {
                     
                            ModelState.AddModelError("solicitacao_descricao", "*Quantidade deve ser maior que 0.");
                       
                    }
                }

                if (solicitacao.sol_impressora == -1)
                {
                    ModelState.AddModelError("sol_impressora", "*Nenhuma impressora selecionada.");
                }


                if (ModelState.IsValid)
                {
                    ModelState.Clear();
                    _solicitacaoapp.Inserir(Mapper.Map<solicitacaoViewModel, solicitacoes_impressoras>(solicitacao));
                    ViewBag.res = "Solicitação enviada com sucesso.";
                    solicitacao = new solicitacaoViewModel();
                    solicitacao.data_horario = DateTime.Now.ToShortDateString();
                    ViewBag.unidade = new SelectList(_usuarioapp.busca_unidades(0), "uni_codigo", "uni_descricao", _usuarioapp.GetUsuarioLogado(0).uni_codigo);
                    ViewBag.sol_tipo = new SelectList(_solicitacaoapp.carrega_tipo_solicitacoes(), "tip_codigo", "tip_descricao");

                    if (_usuarioapp.verifica_permissao(5355))
                    {

                        ViewBag.flag_todos = 1;
                    }
                    else {


                        ViewBag.flag_todos = 0;
                    }

                }

                else
                {

                    ViewBag.unidade = new SelectList(_usuarioapp.busca_unidades(0), "uni_codigo", "uni_descricao", _usuarioapp.GetUsuarioLogado(0).uni_codigo);
                    ViewBag.sol_tipo = new SelectList(_solicitacaoapp.carrega_tipo_solicitacoes(), "tip_codigo", "tip_descricao", solicitacao.sol_tipo);
                }

                return View(solicitacao);
            }
            catch (Exception ex)
            {
                ViewBag.res = null;
             

                if (ex.Message.Substring(0, 5) == "email")
                {

                    solicitacao = new solicitacaoViewModel();
                    solicitacao.data_horario = DateTime.Now.ToShortDateString();
                    ViewBag.unidade = new SelectList(_usuarioapp.busca_unidades(0), "uni_codigo", "uni_descricao", _usuarioapp.GetUsuarioLogado(0).uni_codigo);
                    if (_usuarioapp.verifica_permissao(5355))
                    {
                       
                        ViewBag.flag_todos = 1;
                    }
                    else {

                        ViewBag.flag_todos = 0;
                    }

                    ViewBag.sol_tipo = new SelectList(_solicitacaoapp.carrega_tipo_solicitacoes(), "tip_codigo", "tip_descricao");
                    ViewBag.res = "Aviso inserido com sucesso, mas não foi possível enviar email para todos os envolvidos,pelo seguinte erro" + "<br /><br />" + ex.Message.Substring(5, ex.Message.Length - 5);
                    ModelState.Clear();
                }
                else
                {

                    ViewBag.unidade = new SelectList(_usuarioapp.busca_unidades(0), "uni_codigo", "uni_descricao", solicitacao.unidade);
                    ViewBag.sol_tipo = new SelectList(_solicitacaoapp.carrega_tipo_solicitacoes(), "tip_codigo", "tip_descricao", solicitacao.sol_tipo);
                    if (_usuarioapp.verifica_permissao(5355))
                    {
                        ViewBag.flag_todos = 1;
                    }
                    else {

                       
                        ViewBag.flag_todos = 0;
                    }

                   
                    ViewBag.err = "Erro ao inserir a solicitação: " + ex.Message + ", contate o administrador";

                }
                return View(solicitacao);
            }



        }


        [Authorize]
        public ActionResult Visualizar(string codigo, string dt1, string dt2, string pagina)
        {

            try
            {
                VW_solicitacoes_impressoras VW = null;
                VW = _solicitacaoapp.carrega_sol_email(Int64.Parse(codigo));
                VW.sol_horario = VW.sol_data.ToShortDateString() + " " + VW.sol_horario;
          
                if (VW != null)
                {
                    return View(VW);

                }
                else
                {
                    TempData["msg_err"] = "Solicitação não encontrada.";
                    return RedirectToAction("Manutencao", "Solicitacao", new { page = int.Parse(pagina), dt1 = dt1, dt2 = dt2, });
                }

            }
            catch (Exception ex)
            {
              

               TempData["msg_err"] = "Erro ao cancelar solicitação: " + ex.Message + ", contate o administrador";
                return RedirectToAction("Manutencao", "Solicitacao", new { page = int.Parse(pagina), dt1 = dt1, dt2 = dt2, });
            }


        }


        [Authorize]
        public ActionResult Reenviar(string codigo, string dt1, string dt2, string pagina)
        {

            try
            {
                VW_solicitacoes_impressoras VW = null;
                VW = _solicitacaoapp.carrega_sol_email(Int64.Parse(codigo));

                TempData.Remove("res");
                TempData.Remove("msg_err");

                if (VW != null)
                {
                    _solicitacaoapp.enviar_email(VW, _usuarioapp.GetUsuarioLogado(0), "s");
                    TempData["res"] = "Solicitação reenviada com sucesso.";
                 
                }
                else
                {
                  
                    TempData["msg_err"] = "Solicitação não encontrada.";
                   
                   
                }


                return RedirectToAction("Manutencao", "Solicitacao", new { page = int.Parse(pagina), dt1 = dt1, dt2 = dt2, });
            }
            catch (Exception ex)
            {
                if (ex.Message.Substring(0, 5) == "email")
                {
                    TempData["res"] = "Solicitação reenviada com sucesso, mas não foi possível enviar email para todos os envolvidos,pelo seguinte erro" + "<br /><br />" + ex.Message.Substring(5, ex.Message.Length - 5);
                }
                else
                {
                    TempData["msg_err"] = "Erro ao cancelar solicitação: " + ex.Message + ", contate o administrador";
                }
                    return RedirectToAction("Manutencao", "Solicitacao", new { page = int.Parse(pagina), dt1 = dt1, dt2 = dt2, });
            }


        }


    }

}
